package com.kerrykidz.scmstock.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.kerrykidz.scminvoicing.dao.mapper.GblScmPrdEntityMapper;
import com.kerrykidz.scminvoicing.dao.mapper.ScmInStgEntityMapper;
import com.kerrykidz.scminvoicing.dao.mapper.ScmInstgPrdEntityMapper;
import com.kerrykidz.scminvoicing.dao.mapper.ScmPrdStgEntityMapper;
import com.kerrykidz.scminvoicing.dao.mapper.ScmPurOrderEntityMapper;
import com.kerrykidz.scminvoicing.dao.model.GblScmPrdEntity;
import com.kerrykidz.scminvoicing.dao.model.ScmInStgEntity;
import com.kerrykidz.scminvoicing.dao.model.ScmInstgPrdEntity;
import com.kerrykidz.scminvoicing.dao.model.ScmPrdStgEntity;
import com.kerrykidz.scminvoicing.dao.model.ScmPurOrderEntity;
import com.kerrykidz.scmstock.service.IStockGoodsInService;
import com.kerrykidz.system.vo.UserInfo;
import com.rdp.framework.exception.RDPException;

/**
 * 
 * @ClassName: StockGoodsInServiceImpl
 * @description: 商品入库模块服务类
 * @author: huanjiang
 * @date: 2014年8月21日 下午2:14:15
 * @version: V1.0
 * 
 */
@Service
public class StockGoodsInServiceImpl implements IStockGoodsInService {

	@Autowired
	// 商品入库
	private ScmInStgEntityMapper scmInStgEntityMapper;
	
	@Autowired
	private GblScmPrdEntityMapper gblScmPrdEntityMapper;

	@Autowired
	// 采购订单
	private ScmPurOrderEntityMapper scmPurOrderEntityMapper;
	@Autowired
	// 入库商品明细
	private ScmInstgPrdEntityMapper scmInstgPrdEntityMapper;

	@Autowired
	// 商品库存表
	private ScmPrdStgEntityMapper scmPrdStgEntityMapper;

	/**
	 * @Title: findScmInStgById
	 * @Description: 查询入库单
	 * @param pkInstgId
	 *            入库单号
	 * @date: 2014年8月8日
	 * @return: List<ScmInStgEntity>
	 */
	public ScmInStgEntity findScmInStg(ScmInStgEntity scmInStg)
			throws RDPException {
		scmInStg.setIspaging(true);
		List<ScmInStgEntity> beanList = scmInStgEntityMapper
				.findScmInStg(scmInStg);
		if (beanList.size() > 0) {
			scmInStg.setResults(beanList);
		}
		return scmInStg;
	}

	/**
	 * @Title: findScmPurOrderForStock
	 * @Description:获得新增入库需要的采购订单实例
	 * @param: <@param scmPurOrder
	 * @date: 2014年8月12日
	 * @return: List<ScmPurOrderEntity>
	 */
	public ScmPurOrderEntity findScmPurOrderForStock(
			ScmPurOrderEntity scmPurOrder) throws RDPException {
		scmPurOrder.setIspaging(true);
		List<ScmPurOrderEntity> beanList = scmPurOrderEntityMapper
				.findScmPurOrderForStock(scmPurOrder);
		if (beanList.size() > 0) {
			scmPurOrder.setResults(beanList);
		}
		return scmPurOrder;
	}

	/**
	 * 
	 * @Title: insertScmInStg
	 * @Description:商品入库单表插入数据
	 * @param: @param scmInStg
	 * @date: 2014年8月13日
	 * @return: void
	 * @throws RDPException
	 * 
	 */
	public void insertScmInStg(ScmInStgEntity scmInStg) throws RDPException {
		scmInStgEntityMapper.insertScmInStg(scmInStg);
	}

	/**
	 * 
	 * @Title: insertScmInstgPrd
	 * @Description: 商品入库时入库商品明细表插入数据
	 * @param scmInstgPrd
	 * @date: 2014年8月13日
	 * @return: void
	 * @throws RDPException
	 * 
	 */
	public void insertScmInstgPrd(ScmInstgPrdEntity scmInstgPrd)
			throws RDPException {
		scmInstgPrdEntityMapper.insertScmInstgPrd(scmInstgPrd);
	}

	/**
	 * 
	 * @Title: insertScmPrdStg
	 * @Description:商品入库时商品库存表插入数据
	 * @param: scmPrdStg
	 * @date: 2014年8月13日
	 * @return: void
	 * @throws RDPException
	 * 
	 */
	public void insertScmPrdStg(ScmPrdStgEntity scmPrdStg) throws RDPException {
		scmPrdStgEntityMapper.insertScmPrdStg(scmPrdStg);
		//修改商品表Mode_time
		GblScmPrdEntity prod = new GblScmPrdEntity();
		prod.setPkPrdId(scmPrdStg.getFkPrdId());
		prod.setModiTime(scmPrdStg.getModiTime());
		gblScmPrdEntityMapper.updateEntity(prod);
	}

	/**
	 * 
	 * @Title: updateScmPurOrderForStock
	 * @Description:  入库时更新采购订单表
	 * @param scmPurOrder
	 * @date: 2014年8月14日
	 * @return: void
	 * @throws RDPException
	 * 
	 */
	public void updateScmPurOrderForStock(ScmPurOrderEntity scmPurOrder)
			throws RDPException {
		scmPurOrderEntityMapper.updateScmPurOrderForStock(scmPurOrder);
	}

	/**
	 * 
	 * @Title: rollBackForStockIn
	 * @Description:删除入库单后，回滚更新商品库存
	 * @param: fkInstgId 入库单号
	 * @param: ScmPrdStgEntity
	 * @date: 2014年8月21日
	 * @return: boolean
	 * @throws RDPException
	 */
	public synchronized boolean rollBackForStockIn(String fkInstgId, ScmPrdStgEntity stgBean)
			throws RDPException {
		ScmInStgEntity sig = new ScmInStgEntity();
		sig.setPkInstgId(fkInstgId);
		//获取门店
		List<ScmInStgEntity>  sigLsit = scmInStgEntityMapper.findScmInStg(sig);
		String branId = null;
		ScmInStgEntity sigBean = null;
		if(sigLsit.size() == 0)
		{
			return false;
		}else {
			sigBean = sigLsit.get(0);
			branId = sigBean.getFkBranId();
		}
		if(branId == null)
		{
			return false;
		}
		List<ScmInstgPrdEntity> scmInstgPrdList = scmInstgPrdEntityMapper
				.findScmInstgPrd(fkInstgId);
		if (scmInstgPrdList.size() > 0) {
			for (ScmInstgPrdEntity bean : scmInstgPrdList) {
				ScmPrdStgEntity scmPrdStg = new ScmPrdStgEntity();
				scmPrdStg.setFkPrdId(bean.getFkPrdId());
				scmPrdStg.setInstgCnt(0 - bean.getInstgCnt());
				scmPrdStg.setFkBranId(branId);
				scmPrdStg.setModiBy(stgBean.getModiBy());
				scmPrdStgEntityMapper.updateScmPrdStg(scmPrdStg);
			}
		}
		scmInStgEntityMapper.delScmInStg(fkInstgId);//更新商品入库表删除标记
		//获取对应当前订单剩余的入库单数
		ScmInStgEntity scmInStgBean = new ScmInStgEntity();
		scmInStgBean.setFkBranId(branId);
		String purordId = sigBean.getFkPurordId();
		scmInStgBean.setFkPurordId(purordId);
		ScmInStgEntity resultBean = getStockInCount(scmInStgBean);
		int count = Integer.parseInt(resultBean.getStockCnt());
		
		ScmPurOrderEntity scmPurOrder = new ScmPurOrderEntity();
		scmPurOrder.setPkPurordId(purordId);
		if(count == 0)
		{
			scmPurOrder.setDeliveryStatus("1");
		}else
		{
			scmPurOrder.setDeliveryStatus("2");
		}
		updateScmPurOrderForStock(scmPurOrder);
		return true;
	}

	/**
	 * @Title: selectScmPrdStg
	 * @Description:查询商品入库清单
	 * @param: scmInStgEntity
	 * @date: 2014年8月19日
	 * @return: scmInStgEntity
	 * @throws RDPException
	 * 
	 */
	public ScmInStgEntity selectScmInStg(String pkInstgId) throws RDPException {
		ScmInStgEntity scmInStgEntity = scmInStgEntityMapper
				.selectScmInStg(pkInstgId);
		return scmInStgEntity;
	}

	/**
	 * @Title: selectScmInstgPrd
	 * @Description:查询商品备注
	 * @param: fkInstgId
	 * @date: 2014年8月19日
	 * @return: scmInStgPrdEntity
	 * @throws RDPException
	 * 
	 */
	public List<ScmInstgPrdEntity> findScmInstgPrd(String fkInstgId)
			throws RDPException {
		List<ScmInstgPrdEntity> list = scmInstgPrdEntityMapper
				.findScmInstgPrd(fkInstgId);
		return list;
	}
	
	/**
	 * 
	 * @Title: insertScmPrdStg
	 * @Description:商品入库时商品库存表更新数据
	 * @param: scmPrdStg
	 * @date: 2014年8月13日
	 * @return: void
	 * @throws RDPException
	 * 
	 */
	public void updateScmPrdStg(ScmPrdStgEntity scmPrdStg) throws RDPException {
		scmPrdStgEntityMapper.updateScmPrdStg(scmPrdStg);// 如果库存中已经拥有本产品则更新数据
		
		//修改商品表Mode_time
		GblScmPrdEntity prod = new GblScmPrdEntity();
		prod.setPkPrdId(scmPrdStg.getFkPrdId());
		prod.setModiTime(scmPrdStg.getModiTime());
		gblScmPrdEntityMapper.updateEntity(prod);
	}

	/**
	 * 
	 * @Title: stockGoodsInOpertion
	 * @Description: 商品入库操作 包括插入和更新数据
	 * @param userInfo 包含登录用户信息
	 * @param stockId 入库编号
	 * @param content 表格数据
	 * @param purordId 采购编号
	 * @param isGoOn true 入库继续 false 入库
	 * @throws RDPException
	 * @date: 2014年8月14日
	 */
	public synchronized void stockGoodsInOpertion(UserInfo userInfo, String stockId,
			String content, String purordId, String attFile)
			throws RDPException {
		String userId = userInfo.getUserId();
		String storeId = userInfo.getBranId();
		ScmInStgEntity scmInStg = new ScmInStgEntity();
		scmInStg.setPkInstgId(stockId);// 入库单编号
		scmInStg.setFkPurordId(purordId);// 采购订单编号
		scmInStg.setFkBranId(storeId);// 门店编号
		scmInStg.setAttFile(attFile);// 入库单附件
		scmInStg.setModiBy(userId);// 制单人
		scmInStg.setDelFlag("0");
		insertScmInStg(scmInStg);

		String contents[] = content.split("[|]");
		boolean status = true;
		int sum = 0;
		//采购订单DELIVERY_STATUS 状态变成2 ：部分收货
		String deliveryStatus = "2";
		for (String s : contents) {
			/*
			 * contents data[0]商品id data[1]应收数量 data[2] 实际数量  data[3]库存数量
			 * data[4]累计数量 data[5] 备注 //商品编号_应收数量_实际数量_库存数量_累计数量_备注
			 */
			String data[] = s.split("_");
			ScmInstgPrdEntity scmInstgPrd = new ScmInstgPrdEntity();
			scmInstgPrd.setFkInstgId(stockId);// 入库单编号
			scmInstgPrd.setFkPrdId(data[0]);// 入库商品编号
			int instgCnt = Integer.valueOf(data[2]);
			scmInstgPrd.setInstgCnt(instgCnt);
			if (data.length > 5) {
				scmInstgPrd.setComments(data[5]);// 备注信息
			}
			insertScmInstgPrd(scmInstgPrd);

			int purCnt = Integer.valueOf(data[1]);
			int total = Integer.valueOf(data[4]);
			// 如果累计数量少于应收数量，表示商品未收齐
			if (total < purCnt) {
				status = false;
			}

			sum += total;// 求得当前采购订单累计收货数量

			ScmPrdStgEntity scmPrdStg = new ScmPrdStgEntity();
			scmPrdStg.setFkBranId(storeId);
			scmPrdStg.setFkPrdId(data[0]);
			scmPrdStg.setModiBy(userId);
			if ("null".equals(data[3])) {
				// 商品库存数量为null时 商品库存表中插入新的商品信息
				scmPrdStg.setStgCnt(instgCnt);
				insertScmPrdStg(scmPrdStg);
			} else {
				scmPrdStg.setInstgCnt(Integer.valueOf(data[2]));
				updateScmPrdStg(scmPrdStg);
			}
			//修改商品表Mode_time
			GblScmPrdEntity prod = new GblScmPrdEntity();
			prod.setPkPrdId(scmPrdStg.getFkPrdId());
			prod.setModiTime(scmPrdStg.getModiTime());
			gblScmPrdEntityMapper.updateEntity(prod);
		}
		ScmPurOrderEntity scmPurOrder = new ScmPurOrderEntity();
		scmPurOrder.setPkPurordId(purordId);
		if (status) {
			// 采购单对应的商品全部收齐，采购订单DELIVERY_STATUS 状态变成3 ：收货完成
			deliveryStatus = "3";
		}
		if (sum == 0) {
			// 一件商品都没收，DELIVERY_STATUS 状态为1：未收货
			deliveryStatus = "1";
		}
		scmPurOrder.setDeliveryStatus(deliveryStatus);
		updateScmPurOrderForStock(scmPurOrder);
	}

	/**
	 * 
	* @Title: getStockInCount
	* @Description: 商品入库单中查询当前订单数，
	* 用于判断删除入库单后，订单的到货状态：如果订单数为0，表示该订单未到货
	* @param: scmInStg
	* @date: 2014年8月28日
	* @return: ScmInStgEntity
	* @throws RDPException
	*
	 */
	 public ScmInStgEntity getStockInCount(ScmInStgEntity scmInStg)throws RDPException
	 {
		return scmInStgEntityMapper.getStockInCount(scmInStg);
		 
	 }
}
